package com.itzhoun;

import com.itzhoun.classAdapter.AdapterUSB2VGA;
import com.itzhoun.interfaceAdapter.AdapterUSB1VGAImpl;
import com.itzhoun.objectAdapter.AdapterUSB3VGA;

/**
 * @author 周楠
 * @Date 2023/01/14/下午 5:55
 */
public class AdapterTest {

    /**
     * 定义： 适配器模式将某个类的接口转换成客户端期望的另一个接口表示，目的是消除由于接口不匹配所造成的类的兼容性问题。
     *
     * 主要分为三类：类的适配器模式、对象的适配器模式、接口的适配器模式。
     */

    /**
     * 这里举例是将USB接口转为VGA接口 只有VGA可以播放
     * @param args
     */

    public static void main(String[] args) {
        //
        //类的适配器 通过创建类的适配器一个适配器对象
        VGA vga = new AdapterUSB2VGA();
        //进行投影
        Projector objectProjector = new Projector();
        objectProjector.projection(vga);

        //唱 和看
        vga.watch();
        vga.song();

        //对象适配器
        VGA vga1 = new AdapterUSB3VGA();
        //进行投影
        Projector objectProjector1 = new Projector<>();
        objectProjector1.projection(vga1);

        //唱 和看
        vga1.watch();
        vga1.song();

        //接口适配器
        VGA vga2 = new AdapterUSB1VGAImpl();
        //进行投影
        Projector objectProjector2 = new Projector<>();
        objectProjector2.projection(vga2);

        //唱 和看
        vga2.watch();
        vga2.song();

        /**
         * 总结一下三种适配器模式的应用场景：
         *
         * 类适配器模式：当希望将一个类转换成满足另一个新接口的类时，可以使用类的适配器模式，创建一个新类，继承原有的类，实现新的接口即可。
         *
         * 对象适配器模式：当希望将一个对象转换成满足另一个新接口的对象时，可以创建一个Wrapper类，持有原类的一个实例，在Wrapper类的方法中，调用实例的方法就行。
         *
         * 接口适配器模式：当不希望实现一个接口中所有的方法时，可以创建一个抽象类Wrapper，实现所有方法，我们写别的类的时候，继承抽象类即可。
         *
         * 命名规则：
         *
         * 我个人理解，三种命名方式，是根据 src是以怎样的形式给到Adapter（在Adapter里的形式）来命名的。
         *
         * 类适配器，以类给到，在Adapter里，就是将src当做类，继承，
         *
         * 对象适配器，以对象给到，在Adapter里，将src作为一个对象，持有。
         *
         * 接口适配器，以接口给到，在Adapter里，将src作为一个接口，实现。
         *
         * 使用选择：
         *
         * 根据合成复用原则，组合大于继承。因此，类的适配器模式应该少用。
         */



    }
}
